从SimpleNeuralNetwork开始构建多层感知机到CNN再到LSTM,通过代码熟悉tf下DNN的模型构建方式。
构建一个包含2个隐含层hidden layers全连接网络,也即平常说的多层感知机multi layer perceptron,继续使用mnist数据集进行模型训练以及应用。
这里设置2层,每层256个神经节点neurons,输入为784dim的image,output为10 classes。
对于中间的hidden layer,需要的w为
1 | num_input = 784 |
tf.random_normal(shape, mean=.0, stddev=1.0,dtype=tf.float32,seed=None, name=None),random_normal默认返回均值为0,方差为1的标准正态分布产生的随机数,tensor的维度以shape给出。
这里定义了两个隐含层,因此完整的网络结构定义如下
1 | X = tf.placeholder([None,num_input]) |
这里定义的layer1,layer2都是隐含层,out为最后的输出层。这里我们直接将matmul
的结果(是一个tensor) + 另外一个tensor;目前来看,也可以用tf.add(tensor1, tensor2)来完成相加,两者的结果应该是一样。函数whole_network以x为输入,从x开始构建隐含层,构建输出层。
接下来定义pred以及loss
1 |
|
logits代表整个network,而pred则是对logits取softmax,这种情况下loss函数与上一篇中提及的loss方式有些不同,这里使用了softmax_cross_entropy_with_logits(logits,labels),上篇中使用的loss计算方式是
1 | loss = tf.reduce_sum(-tf.reduce_sum(y * tf.log(pred), 1)) |
其实两者的计算结果是一样的,实验如下
1 | logits = tf.constant([[1.0, 2.0, 3.0], [1.0,2.0, 3.0],[1.0, 2.0, 3.0]]) |
注意的是,tf.nn.softmax_cross_entropy_with_logits(labels, logits)这个函数返回一个向量,即dim=1的tensor,首先计算softmax,保持shape不变,然后计算交叉熵,这一步\sigma(y_*log(pred)),降维到向量。
相当于tf.reduce_sum(tensor,1),对每个instance进行聚合了。